#include "sort.h"
#include "ticket.h"
// SORT * create_sort(int size)
// {
//      SORT * p = malloc(sizeof(SORT));
//      p->pData = malloc(sizeof(void*)*size);
//      p->size = size;
//      p->used = 0;
// }
// int userID = 0;//用户ID初始化为0
// USER * createUser()
// {
//      //分配用户空间
//      USER * p = malloc(sizeof(USER));
//      //将ID存入到结构体，同时让ID加1
//      p->id = userID++;
//      printf("请输入用户名:\n");
//      scanf("%s",p->name);
//      printf("请输入用的年龄:\n");
//      scanf("%d",&p->age);
//      return p;
// }

int compareInt(void *pElm1, void *pElm2){
      return *(int*)pElm1 - *(int*)pElm2;
} 

int compareTime(void *pElm1, void *pElm2){

}

int comparePrice(void *pElm1, void *pElm2){
   return ((TICKET*)pElm1)->price-((TICKET*)pElm2)->price   ;
}

void insertSort(void * pArray,int len,int elSize,int (*compFun)(void *, void *),int way) //通用化插入排序，，从小到大排
{             
        for (int i = 1; i <len ; i++)   //取数组后面的元素与前面比
        {
         void * pTemp = malloc(sizeof(elSize)) ; // int temp = p[i]; //中间参数temp存储当前比较数的值
          memcpy(pTemp, pArray+i*elSize,elSize);
          int index = i;
            while (index>0) //循环比较
            {       
             if (compFun(pArray+(index-1)*elSize,pTemp)>0&&way ==1)   //数组元素升序则比较
              {       //进行元素比较，前一个大于后一个则将其位置改变 
              memcpy(pArray+index*elSize, pArray+(index-1)*elSize,elSize);
               index--; 
              }
              else if(compFun(pArray+(index-1)*elSize,pTemp)<0&&way ==2) //降序
              {               //前一个小于后一个，后移
                memcpy(pArray+index*elSize, pArray+(index-1)*elSize,elSize);
                index--;
              } 
              else{
              break;}
            }
         memcpy(pArray+index*elSize, pTemp,elSize);    //将数插入
        }
    return ;
}

void selectSort(void * pArray,int len,int elSize,int (*compFun)(void *, void *),int way){   //选择排序
  int index=0 ;
  for (int i = 0; i < len-1; i++)
    { index = i;
      for (int j = i+1; j < len ; j++)
      {
        if (compFun(pArray+index*elSize,pArray+j*elSize)>0&&way==1)
        {
           index = j;
        }
        else if (compFun(pArray+index*elSize,pArray+j*elSize)<0&&way==2)
        {
          index = j;
        }
        
      }
      void * pTemp = malloc(sizeof(elSize));
      memcpy(pTemp, pArray+i*elSize,elSize);
      memcpy(pArray+i*elSize, pArray+index*elSize,elSize);
      memcpy(pArray+index*elSize, pTemp,elSize);
      // int temp =p[i];
      // p[i] = p[index];
      // p[index] = temp;
    }
}

void quickSort(void * pArray,int begin,int end,int elSize,int (*compFun)(void *, void *)){   //快速排序
  int index = begin;
  int b = begin;
  int e = end ;
  if (begin<end)
  {
  while (b<e)
    {
    for (e; e > 0; e--)
     {
      if (compFun(pArray+e*elSize,pArray+begin*elSize)<0)
        {
          break;
        }
     }
    for (b; b < e; b++)
    {
      if (compFun(pArray+b*elSize,pArray+index*elSize)>0){
        break;
      }
    }
    void * pTemp = malloc(sizeof(elSize));
      memcpy(pTemp, pArray+e*elSize,elSize);
      memcpy(pArray+e*elSize, pArray+b*elSize,elSize);
      memcpy(pArray+b*elSize, pTemp,elSize);
    }
    void * pTemp = malloc(sizeof(elSize));
      memcpy(pTemp, pArray+e*elSize,elSize);
      memcpy(pArray+e*elSize, pArray+begin*elSize,elSize);
      memcpy(pArray+begin*elSize, pTemp,elSize);
    quickSort(pArray,begin,e-1,elSize,compFun);
    quickSort(pArray,end+1,end,elSize,compFun);
  }
}

// void quickSort(void *pArr, int first, int last)
// {
//      int b = first;//数组的起始位置 0 
//      int e = last;//数组的结束位置 5 
//      int i = first;//需要帮助找到位置的元素的下标 0
//      if(first<last)
//      {
//           while(b<e)
//           {
//                //从后往前找到第一个小于Index的元素
//                while (pArr[e]>pArr[i])
//                {
//                     //往前移动
//                     e--;
//                }
//                while (pArr[b]<=pArr[i]&&b<e)
//                {
//                     b++;
//                }
//                if(b<e)
//                {
//                     int temp = pArr[b];
//                     pArr[b] = pArr[e];
//                     pArr[e] = temp;
//                }               
//           }
//           int temp = pArr[b];
//           pArr[b] = pArr[i];
//           pArr[i] = temp;
//           quickSort(pArr,first,b-1);
//           quickSort(pArr,b+1,last);
//      }
// }